uva 1121

给一个长度为n的序列,问其连续子序列和大于等于s的最短长度。

先预处理S[i],两个指针扫,一个指向当前下标,另一个指向使s[i]-s[j]大于等于s且i-j最短的位置。
注意样例是错的,注意长度为n也不能满足条件的情况,输出0。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

#include <cstdio>
#include <cmath>
#include <cstring>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<cmath>
#include<map>
#include<queue>
using namespace std;
#define mem(x,y) memset(x,y,sizeof(x))
#define inf 10000000
#define debug puts("-----")
#define maxn 4000+6
#define NV 1000
#define NE 10000
#define LL long long
int a[100000+3];
int main()
{

int n,s;
while(~scanf("%d%d",&n,&s))
{
int ans=inf;
a[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
int j=0;
for(int i=1;i<=n;i++)
{
if(a[i]-a[j]<s)continue;
while(a[i]-a[j]>=s)
j++;
j--;
ans=min(i-j,ans);
}
printf("%d\n",ans==inf?0:ans);
}
}

EOF